package thread;


import thread.biz.DOrder;
import thread.biz.Diff;
import thread.biz.POrder;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * st.test.juc.p01
 *
 * @description: 多线程 多重实现方式
 * @author: yechen
 * @email: wangqingfeng@wxyundian.com
 * @date: 2019年09月27日 11:34
 */
public class CheckBatch2 extends AbstractCheckBatch {
    @Override
    public void doProcess() throws Exception {
        System.out.println("---- 多线程处理 ----");
        //默认1个进程 空闲下来工作线程就会捡取等待队列里的其他工作进行执行。
        ExecutorService pool = Executors.newFixedThreadPool(10);
        for (int id : ids) {
            Runnable run = new Runnable() {
                @Override
                public void run() {
                    // 20ms
                    POrder pOrder = pOrderService.getPOrder(id);
                    // 100ms
                    DOrder dOrder = dOrderService.getDOrder(id);
                    Diff diff = check(pOrder, dOrder);
                    if (diff != null)
                        // 2ms
                        save(diff);
                }
            };
            //将线程放入池中进行执行
            pool.execute(run);
        }
        //关闭执行服务对象
        pool.shutdown();
        //该函数所在线程会陷入阻塞，直到shutdown请求发出导致所有线程都结束、或者时间超时、或者当前线程被中断，这三个条件只要发生一个，线程就会跳出阻塞状态。
        //加上了这行，main线程就会阻塞，后面计算执行时间的代码无法执行。直到所有线程执行结束或者到了1分钟，才能计算时间。从而达到目的
        pool.awaitTermination(1, TimeUnit.MINUTES);
    }

    @Override
    protected void doFinal() {

    }


    public static void main(String[] args) {
        Set<Short> set=new HashSet<>();
        for(short i=0;i<100;i++){
            set.add(i);
            set.remove(i-1);
        }
        System.out.println(set.size());
    }
}
